//
//  HMStatusViewModel.swift
//  iOSWeibo11
//
//  Created by Apple on 16/7/22.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

/// 微博模型ViewModel,处理微博模型相关的操作
class HMStatusViewModel: NSObject {
    
    /// 表示VM是否正在加载数据
    private var loadingStatus: Bool = false
    
    // 单例
    static let sharedStatusViewModel: HMStatusViewModel = HMStatusViewModel()

    /// 加载微博数据的方法
    func loadStatus(since_id: Int64, max_id: Int64, completion: (error: NSError?, statusModels: [HMStatus]?) -> Void) {
        
        // 判断是否有人正在加载数据
        if loadingStatus {
            // 有人正在加载数据, 需要让调用的人知道因为有人在加载数据,我们没去加载数据了.
            // TODO:
            // 自定义错误
            // domain: 表示错误的范围, 自定义
            // code: 表示错误的编码,自定义
            let error = NSError(domain: "cn.itheima.network.loadstatus", code: -1, userInfo: ["errorDescription" : "有人正在加载微博数据,直接返回了"])
            completion(error: error, statusModels: nil)
            return
        }
        
        // 没有人在加载数据,来加载数据
        loadingStatus = true
        
        // 使用DAL加载微博数据
        HMStatusDAL.sharedStatusDAL.dalLoadStatus(since_id, max_id: max_id) { (error, statuses) -> Void in
            if error != nil {
                print("加载微博数据出错了: \(error)")
                
                completion(error: error, statusModels: nil)
                
                // 失败了 loadingStatus该成false,让别人可以来加载数据
                self.loadingStatus = false
                return
            }
            
            // 没有出错
            if statuses != nil && statuses!.count > 0 {
                // 有微博数据
                
                // 定义模型数组保存转好的微博模型
                var statusModels = [HMStatus]()
                
                // 遍历数组里面的每个字典
                for dict in statuses! {
                    // 字典转模型
                    let status = HMStatus(dict: dict)
                    
                    // 将模型添加到数组中
                    statusModels.append(status)
                }
                
                // 模型就转好了
                completion(error: nil, statusModels: statusModels)
                
                // 加载完数据了,loadingStatus该成false,让别人可以来加载数据
                self.loadingStatus = false
            } else {
                // 没有模型也没有出错
                completion(error: nil, statusModels: nil)
                self.loadingStatus = false
            }
        }
    }
     /**
     发布一条微博
     
     - parameter status:     要发布的微博文本内容
     - parameter image:      如果图片不为空就发布图片微博,否则发布纯文本微博
     - parameter completion:
     */
    func sendStatus(status: String, image: UIImage?, completion: (error: NSError?) -> Void) {
        guard let access_token = HMUserAccountViewModel.sharedUserAccountViewModel.userAccount?.access_token else {
            print("没有access_token")
            return
        }
        
        // 参数
        let parameters = [
            "access_token": access_token,
            "status": status
        ]
        
        if image == nil {
            // 纯文本微博
            let urlString = "https://api.weibo.com/2/statuses/update.json"
            
            // 发送请求
            HMNetworkTool.sharedNetworkTool.requestPOST(urlString, parameters: parameters, progress: nil, success: { (_, _) -> Void in
                completion(error: nil)
                }) { (_, error) -> Void in
                    completion(error: error)
            }
        } else {
            // 发布图片微博
            let urlString = "https://upload.api.weibo.com/2/statuses/upload.json"
            
            // 发布微博,上传图片
            // constructingBodyWithBlock: 上传文件的闭包
            HMNetworkTool.sharedNetworkTool.requestPOST(urlString, parameters: parameters, constructingBodyWithBlock: { (formdata) -> Void in
                /// 上传一张图片
                // 将UIImage转成二进制
                let data = UIImagePNGRepresentation(image!)!
                
                // data: NSData: 上传文件的二进制数据
                // name: 不要随便写,需要查看API,
                // fileName: 上传到服务器后的名称: 如果API没有指定,可以随便写,服务器会自己重命名
                // mimeType: 资源的类型: 大类型/小类型 image/png, image/jpeg image/gif
                formdata.appendPartWithFileData(data, name: "pic", fileName: "hehe", mimeType: "image/png")
//                formdata.appendPartWithFileData(data, name: "pic", fileName: "hehe", mimeType: "image/png")
//                formdata.appendPartWithFileData(data, name: "pic", fileName: "hehe", mimeType: "image/png")
                }, progress: nil, success: { (_, result) -> Void in
                    completion(error: nil)
                }, failure: { (_, error) -> Void in
                    completion(error: error)
            })
        }
        
    }
}
